//
//  main.m
//  结构体与链表的应用
//
//  Created by apple on 15/8/1.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import <Foundation/Foundation.h>
#include <stdlib.h>

/*char *txt()
{
    char str1[10] = "abcdefg";   栈空间：只是局部的变量，当系统运行完就会自行大回收。
    strcpy(str1, "abcdefg");
    
    return str1;
}*/
char *test()
{
    char *str = malloc(10); // 堆空间：内部分好的空间如果不手动对释放的话，它说是不会自行释放的，这样很占内存，从而影响系统的运行速度。
    strcpy(str, "abcdefg");
    return str;
}

typedef struct Student
{
    char name[20];
    int age;
    float weight;
    float height;
    
    struct Student *next;
}Student;

// 创建链表

Student *createlelink(int n)
{
    Student *pHead = NULL;
    Student *pTail = NULL;// 初始化指针
    
    if (n)
    {
        pHead = malloc(sizeof(Student));
        pHead->age = arc4random_uniform(100);
        pHead->next = NULL;
        
        pTail = pHead;
        
        NSLog(@">age: %d",pHead->age);
    }
    
    for (int i = 0; i < n - 1; i++) {
        Student *p = malloc(sizeof(Student));
        p->age = arc4random_uniform(100);
        p->next = NULL;
        
        pTail->next = p;
        pTail = p;
        NSLog(@">age: %d",p->age);
    }

    return pHead;
}
// 从前往后一个节点一个节点的释放
void release(Student *link)
{
    Student *pNode = link;
    while (pNode) {
        link = pNode->next;
        free(pNode);
        
        pNode = link;
    }
}
void travel(Student *link)
{
    if (link) {
        NSLog(@"%d",link->age);
        travel(link->next);
    }
}
int main(int argc, const char * argv[]) {
    @autoreleasepool
    {
    
        Student *link = createlelink(10);
        
        NSLog(@"------------------------");
        
        Student *pNode = link;
        while (pNode)
        {
            NSLog(@"age = %d",pNode->age);
            pNode = pNode->next;
        }
        
        NSLog(@"---------------------------");
        travel(link);
        
        release(link);
        
#if 0   
        char *pStr = test();
        printf("%s",pStr);
        
        free(pStr);   //释放内存
        //  如果一个指针变量没有指向有效的空间的话，那我们称之为“野指针”或者是“悬空指针”。
        pStr =NULL;   //安全措施，当我们做完之后应该把指针指向0；
#endif
}
    return 0;
}
